- using System.Linq;
- using UnityEngine;
- using UnityEngine.Timeline;
- namespace UnityEditor.Timeline
- {
- partial class TimelineWindow
- {
- static readonly GUIContent[] k_TimeReferenceGUIContents =
- {
- L10n.TextContent("Local", "Display time based on the current timeline."),
- L10n.TextContent("Global", "Display time based on the master timeline.")
- };
- TimelineMarkerHeaderGUI m_MarkerHeaderGUI;
- void MarkerHeaderGUI()
- {
- var timelineAsset = state.editSequence.asset;
- if (timelineAsset == null)
- return;
- if (m_MarkerHeaderGUI == null)
- m_MarkerHeaderGUI = new TimelineMarkerHeaderGUI(timelineAsset, state);
- m_MarkerHeaderGUI.Draw(markerHeaderRect, markerContentRect, state);
- }
- void DrawTransportToolbar()
- {
- using (new EditorGUI.DisabledScope(currentMode.PreviewState(state) == TimelineModeGUIState.Disabled))
- {
- PreviewModeButtonGUI();
- }
- using (new EditorGUI.DisabledScope(currentMode.ToolbarState(state) == TimelineModeGUIState.Disabled))
- {
- GotoBeginingSequenceGUI();
- PreviousEventButtonGUI();
- PlayButtonGUI();
- NextEventButtonGUI();
- GotoEndSequenceGUI();
- PlayRangeButtonGUI();
- TimeCodeGUI();
- ReferenceTimeGUI();
- }
- }
- void PreviewModeButtonGUI()
- {
- if (state.ignorePreview && !Application.isPlaying)
- {
- GUILayout.Label(DirectorStyles.previewDisabledContent, DirectorStyles.Instance.previewButtonDisabled);
- return;
- }
- EditorGUI.BeginChangeCheck();
- var enabled = state.previewMode;
- enabled = GUILayout.Toggle(enabled, DirectorStyles.previewContent, EditorStyles.toolbarButton);
- if (EditorGUI.EndChangeCheck())
- {
-
- if (!enabled)
- {
- state.SetPlaying(false);
- state.recording = false;
- }
- state.previewMode = enabled;
-
-
- if (enabled && state.previewMode)
- state.rebuildGraph = true;
- }
- }
- void GotoBeginingSequenceGUI()
- {
- if (GUILayout.Button(DirectorStyles.gotoBeginingContent, EditorStyles.toolbarButton))
- {
- state.editSequence.time = 0;
- state.EnsurePlayHeadIsVisible();
- }
- }
-
- void PlayButtonGUIEditor()
- {
- EditorGUI.BeginChangeCheck();
- var isPlaying = GUILayout.Toggle(state.playing, DirectorStyles.playContent, EditorStyles.toolbarButton);
- if (EditorGUI.EndChangeCheck())
- {
- state.SetPlaying(isPlaying);
- }
- }
-
-
- void PlayButtonGUIPlayMode()
- {
- bool buttonEnabled = state.masterSequence.director != null &&
- state.masterSequence.director.isActiveAndEnabled;
- using (new EditorGUI.DisabledScope(!buttonEnabled))
- {
- PlayButtonGUIEditor();
- }
- }
- void PlayButtonGUI()
- {
- if (!Application.isPlaying)
- PlayButtonGUIEditor();
- else
- PlayButtonGUIPlayMode();
- }
- void NextEventButtonGUI()
- {
- if (GUILayout.Button(DirectorStyles.nextFrameContent, EditorStyles.toolbarButton))
- {
- state.referenceSequence.frame += 1;
- }
- }
- void PreviousEventButtonGUI()
- {
- if (GUILayout.Button(DirectorStyles.previousFrameContent, EditorStyles.toolbarButton))
- {
- state.referenceSequence.frame -= 1;
- }
- }
- void GotoEndSequenceGUI()
- {
- if (GUILayout.Button(DirectorStyles.gotoEndContent, EditorStyles.toolbarButton))
- {
- state.editSequence.time = state.editSequence.asset.duration;
- state.EnsurePlayHeadIsVisible();
- }
- }
- void PlayRangeButtonGUI()
- {
- using (new EditorGUI.DisabledScope(state.ignorePreview || state.IsEditingASubTimeline()))
- {
- state.playRangeEnabled = GUILayout.Toggle(state.playRangeEnabled, DirectorStyles.Instance.playrangeContent, EditorStyles.toolbarButton);
- }
- }
- void AddButtonGUI()
- {
- if (currentMode.trackOptionsState.newButton == TimelineModeGUIState.Hidden)
- return;
- using (new EditorGUI.DisabledScope(currentMode.trackOptionsState.newButton == TimelineModeGUIState.Disabled))
- {
- if (EditorGUILayout.DropdownButton(DirectorStyles.newContent, FocusType.Passive, EditorStyles.toolbarPopup))
- {
-
- var groupTracks = SelectionManager.SelectedTracks().ToList();
- if (groupTracks.Any(x => x.GetType() != typeof(GroupTrack) || x.lockedInHierarchy))
- groupTracks = null;
- SequencerContextMenu.ShowNewTracksContextMenu(groupTracks, state, EditorGUILayout.s_LastRect);
- }
- }
- }
- void ShowMarkersButton()
- {
- var asset = state.editSequence.asset;
- if (asset == null)
- return;
- var content = state.showMarkerHeader ? DirectorStyles.showMarkersOn : DirectorStyles.showMarkersOff;
- SetShowMarkerHeader(GUILayout.Toggle(state.showMarkerHeader, content, DirectorStyles.Instance.showMarkersBtn));
- }
- internal void SetShowMarkerHeader(bool newValue)
- {
- TimelineAsset asset = state.editSequence.asset;
- if (state.showMarkerHeader == newValue || asset == null)
- return;
- string undoOperation = L10n.Tr("Toggle Show Markers");
- if (newValue)
- {
-
- TimelineUndo.PushUndo(asset, undoOperation);
- asset.CreateMarkerTrack();
- }
- else
- {
- SelectionManager.Remove(asset.markerTrack);
- }
- asset.markerTrack.SetShowTrackMarkers(newValue);
- }
- static void EditModeToolbarGUI(TimelineMode mode)
- {
- using (new EditorGUI.DisabledScope(mode.EditModeButtonsState(instance.state) == TimelineModeGUIState.Disabled))
- {
- var editType = EditMode.editType;
- EditorGUI.BeginChangeCheck();
- var mixIcon = editType == EditMode.EditType.Mix ? DirectorStyles.mixOn : DirectorStyles.mixOff;
- GUILayout.Toggle(editType == EditMode.EditType.Mix, mixIcon, DirectorStyles.Instance.editModeBtn);
- if (EditorGUI.EndChangeCheck())
- EditMode.editType = EditMode.EditType.Mix;
- EditorGUI.BeginChangeCheck();
- var rippleIcon = editType == EditMode.EditType.Ripple ? DirectorStyles.rippleOn : DirectorStyles.rippleOff;
- GUILayout.Toggle(editType == EditMode.EditType.Ripple, rippleIcon, DirectorStyles.Instance.editModeBtn);
- if (EditorGUI.EndChangeCheck())
- EditMode.editType = EditMode.EditType.Ripple;
- EditorGUI.BeginChangeCheck();
- var replaceIcon = editType == EditMode.EditType.Replace ? DirectorStyles.replaceOn : DirectorStyles.replaceOff;
- GUILayout.Toggle(editType == EditMode.EditType.Replace, replaceIcon, DirectorStyles.Instance.editModeBtn);
- if (EditorGUI.EndChangeCheck())
- EditMode.editType = EditMode.EditType.Replace;
- }
- }
-
- void TimeCodeGUI()
- {
- const string timeFieldHint = "TimelineWindow-TimeCodeGUI";
- EditorGUI.BeginChangeCheck();
- var currentTime = state.editSequence.asset != null ? TimeReferenceUtility.ToTimeString(state.editSequence.time, "0.####") : "0";
- var r = EditorGUILayout.GetControlRect(false, EditorGUI.kSingleLineHeight, EditorStyles.toolbarTextField, GUILayout.Width(WindowConstants.timeCodeWidth));
- var id = GUIUtility.GetControlID(timeFieldHint.GetHashCode(), FocusType.Keyboard, r);
- var newCurrentTime = EditorGUI.DelayedTextFieldInternal(r, id, GUIContent.none, currentTime, null, EditorStyles.toolbarTextField);
- if (EditorGUI.EndChangeCheck())
- state.editSequence.time = TimeReferenceUtility.FromTimeString(newCurrentTime);
- }
- void ReferenceTimeGUI()
- {
- if (!state.IsEditingASubTimeline())
- return;
- EditorGUI.BeginChangeCheck();
- state.timeReferenceMode = (TimeReferenceMode)EditorGUILayout.CycleButton((int)state.timeReferenceMode, k_TimeReferenceGUIContents, DirectorStyles.Instance.timeReferenceButton);
- if (EditorGUI.EndChangeCheck())
- OnTimeReferenceModeChanged();
- }
- void OnTimeReferenceModeChanged()
- {
- m_TimeAreaDirty = true;
- InitTimeAreaFrameRate();
- SyncTimeAreaShownRange();
- foreach (var inspector in InspectorWindow.GetAllInspectorWindows())
- {
- inspector.Repaint();
- }
- }
- void DrawHeaderEditButtons()
- {
- if (state.editSequence.asset == null)
- return;
- using (new GUILayout.HorizontalScope(EditorStyles.toolbar, GUILayout.Width(sequenceHeaderRect.width)))
- {
- GUILayout.Space(DirectorStyles.kBaseIndent);
- AddButtonGUI();
- GUILayout.FlexibleSpace();
- EditModeToolbarGUI(currentMode);
- ShowMarkersButton();
- EditorGUILayout.Space();
- }
- }
- }
- }